package com.topfox.service;


import com.topfox.common.*;
import com.topfox.util.DataCache;
import com.topfox.sql.Condition;
import com.topfox.sql.EntitySelect;
import java.util.*;

public interface IService<DTO extends DataDTO> extends ISuperService {
    /**
     * 返回 一级 二级缓存处理类
     */
    DataCache dataCache();

    /**
     * 创建一个新的条件对象Condition
     * com.topfox.sql.Condition
     * @return
     */
    Condition where();

    int insert(DTO dto);

    /**
     * 约束: 只一个表只有一个主键字段, 整型自增
     * @param dto
     *
     * @return 返回 插入DTO的 主键Id
     */
    long insertGetKey(DTO dto);

    int insertList(List<DTO> list);



    int update(DTO dto);
    int update(DTO dto, int updateMode);
    int updateList(List<DTO> list);
    int updateList(List<DTO> listUpdate, int updateMode);

    /**
     * 自定更新条件, 不是根据Id更新时用此方法
     */
    List<DTO> updateBatch(DTO dto, Condition where);
    int updateBatch(DTO dataDTO, DataQTO qto);


    int delete(DTO dto);
    int deleteList(List<DTO> list);

    /**
     * 根据多个Id, 生成一句SQL删除, 无乐观锁
     * 先查询出来, 目的是得到每条记录的id, 然后根据Id删除redis缓存
     * @param ids
     * @return
     */
    int deleteByIds(String... ids);
    int deleteByIds(Number... ids);

    /**
     * 自定义删除条件, 即不是根据主键的删除才用这个
     * 先查询出来, 目的是得到每条记录的id, 然后根据Id删除redis缓存
     * @param where
     * @return
     */
    List<DTO> deleteBatch(Condition where);



    /**
     * 支持一次提交存在增删改的多行, 依据DTO中dataState()状态来识别增删改操作.
     * @see com.topfox.data.DbState
     * @param list
     */
    void save(List<DTO> list) ;



    Response<List<DTO>> query(DataQTO qto, String sqlId, String index);
    Response<List<DTO>> list(DataQTO qto);

    DTO getObject(Number id) ;
    DTO getObject(String id) ;
    DTO getObject(String id, boolean isCache) ;
    DTO getObject(DataQTO qto) ;
    DTO getObject(Condition where) ;

    List<DTO> listObjects(String... ids) ;
    List<DTO> listObjects(Number... ids) ;
    List<DTO> listObjects(Set setIds) ;
    List<DTO> listObjects(Set ids, boolean isCache) ;
    List<DTO> listObjects(DataQTO qto) ;
    List<DTO> listObjects(Condition where) ;
    List<DTO> listObjects(EntitySelect entitySelect);


    Response<List<DTO>> listPage(EntitySelect entitySelect);

    EntitySelect select();
    EntitySelect select(String fields);
    EntitySelect select(String fields,Boolean isAppendAllFields);

    List<Map<String, Object>> selectMaps(DataQTO qto) ;
    List<Map<String, Object>> selectMaps(Condition where) ;
    List<Map<String, Object>> selectMaps(EntitySelect entitySelect);

    Response<List<Map<String, Object>>> selectPageMaps(EntitySelect entitySelect);

    int selectCount(Condition where);
    <T> T selectMax(String fieldName, Condition where);

}